(function () {
	// 定义一个表示人的类
	class Person {
		// TS可以在属性前面添加属性的修饰符
		/**
		 *  public 修饰的属性可以在任意位置访问（修改）属性值
		 *  private 私有属性 私有属性只能在类内部进行访问（修改）
		 *      - 通过类中添加方法使得私有属性可以被外部访问
		 *  protected 受保护的属性，只能在当前类和当前类的子类中使用（修改）
		 */
		private _name: string;
		private _age: number;

		constructor(name: string, age: number) {
			this._name = name;
			this._age = age;
		}

		/**
		 *  getter 方法用来读取属性
		 *  setter 方法用来设置属性
		 *      - 它们被称为属性的存取器
		 */
		// 定义方法 用于获取name属性
		// getName() {
		// 	return this._name;
		// }

		// // 定义方法 用于设置name属性
		// setName(value: string) {
		// 	this._name = value;
		// }

		// getAge() {
		// 	return this._age;
		// }

		// setAge(value: number) {
		// 	if (value >= 0) {
		// 		this._age = value;
		// 	} else {
		// 		console.log('年龄有误');
		// 	}
		// }

		// TS中getter、setter的设置方法
		get name() {
			return this._name;
		}
		set name(value: string) {
			this._name = value;
		}

		get age() {
			return this._age;
		}

		set age(value: number) {
			if (value >= 0) {
				this._age = value;
			} else {
				console.log('年龄有误');
			}
		}
	}

	const person = new Person('tom', 10);
	// console.log(person);

	/**
	 *  现在属性是在对象中设置的，属性可以被任意的修改
	 *      属性可以被任意修改将会导致对象中的数据变得非常不安全
	 */
	// person._name = 'jerry';
	// person.setName('jerry');
	// console.log(person.getName());

	// person.setAge(-20);
	// console.log(person.getAge());

	// TS中使用getter、setter
	// person.name = 'jerry';
	// console.log(person.name);

	// person.age = -30;
	// console.log(person.age);

	class A {
		protected name: string;

		constructor(name: string) {
			this.name = name;
		}
	}

	class B extends A {
		test() {
			console.log(this.name);
		}
	}

	const b = new B('tom');
	// console.log(b.name);

	// class C {
	// 	name: string;
	// 	age: number;

	// 	constructor(name: string, age: number) {
	// 		this.name = name;
	// 		this.age = age;
	// 	}
	// }

	class C {
		constructor(public name: string, public age: number) {}
	}

	const c = new C('tomm', 30);
	console.log(c);
})();
